/**
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
/*
假设到(i,j)位置有dp[i][j]种路径 (0<=i<m,0<=j<n)
而考虑到如果要去到 (i，j)位置，只能从上面或者左边过来
    -- 从上面来--> 要到达上面也就是(i-1,j) 有dp[i-1][j]种方法，再到(i,j)只能往下走一步，因此 dp[i-1][j] * 1
    -- 从左面来--> 要到达左面也就是(i,j-1) 有dp[i][j-1]种方法，再到(i,j)只能往右走一步，因此 dp[i][j-1] * 1
    -- 因此 dp[i][j] = dp[i-1][j] * 1 + dp[i][j-1] * 1 = dp[i-1][j]+dp[i][j-1]
考虑边界情况：
    -- i==0;目标位置在最上一行，没有更上一行，因此没有从上面来的情况，只有从左边来(（0，0）除外)，dp[i][j] = dp[i][j-1]
    -- j==0;目标位置在最左一行，没有更左一行，因此没有从左面来的情况，只有从上边来(（0，0）除外)，dp[i][j] = dp[i-1][j]
* */
var uniquePaths = function(m, n) {
     if(m===1 && n===1) return 1
    let dp=Array.from({length:m+1},(n)=>{
        return Array.from(n+1).fill(null)
    })
    dp[0][0]=1
    dp[0][1]=1
    dp[1][0]=1
    dp[1][1]=1 //实际上只有这个有用，但是dp[1][0] 和 dp[0][1]可能被访问
    for(let i=1;i<=m;i++){
        for(let j=1;j<=n;j++){
            if(i===1 || j===1){
                //右边和上边的位置
                dp[i][j]=dp[i===1?i:i-1][j===1?j:j-1]
            }else{
                dp[i][j]=dp[i][j-1]+dp[i-1][j]
            }
        }
    }
    return dp[m][n]
};

let m=3
let n=7
console.log(uniquePaths(m,n));